package com.macro.mall.portal.test;

import cn.hutool.core.codec.Base64;
import com.macro.mall.portal.domain.RequestData;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;

    public class KdniaoSubscribeDemo {


        //用户ID，快递鸟提供，注意保管，不要泄漏
        private final String EBusinessID="1870528";//即用户ID，登录快递鸟官网会员中心获取 https://www.kdniao.com/UserCenter/v4/UserHome.aspx
        //API key，快递鸟提供，注意保管，不要泄漏
        private final String ApiKey="0e3ae369-fd9c-4dca-8dbf-d5a54cc3142e";//即API key，登录快递鸟官网会员中心获取 https://www.kdniao.com/UserCenter/v4/UserHome.aspx
        //请求url, 正式环境地址
        private final String ReqURL="https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";



        public static void main(String[] args) {
            try {

                KdniaoSubscribeDemo api = new KdniaoSubscribeDemo();
                RequestData requestData = new RequestData();
                requestData.setCustomerName("19839110535");
                requestData.setLogisticCode("YT1892005594815");
                requestData.setShipperCode("圆通快递");

                System.out.println(api.orderOnlineByJson(requestData));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        //判断


        //轨迹订阅接口
        public   String orderOnlineByJson(RequestData requestData){
            try {
                String shipperCode = getShipperCode(requestData.getShipperCode());
                if (shipperCode==null){
                    return "快递公司编码不存在";
                }
                String customerName = getCustomerName(requestData.getCustomerName());

                System.out.println("订阅请求body:" + shipperCode);
                // 组装应用级参数
                String RequestData= "{"+
                        "'Callback':'',"+
                        "'ShipperCode':'"+shipperCode+"',"+//快递公司编码
                        "'LogisticCode':'"+requestData.getLogisticCode()+"',"+//快递单号1   2
                        "'CustomerName':'"+customerName+"',"+//收货人手机号后四位
                        "}";
                // 组装系统级参数
                Map<String,String> params = new HashMap<String,String>();
                params.put("RequestData", urlEncoder(RequestData, "UTF-8"));
                params.put("EBusinessID", EBusinessID);
                params.put("RequestType", "8001");//免费订阅接口指令1008/在途监控订阅接口指令8008/地图版订阅接口指令8005
                String dataSign=encrypt(RequestData, ApiKey, "UTF-8");
                params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
                params.put("DataType", "2");
                // 以form表单形式提交post请求，post请求体中包含了应用级参数和系统级参数
                String result=sendPost(ReqURL, params);

                //根据公司业务处理返回的信息......
                return result;
            }catch (Exception e){
              throw new RuntimeException(e);
            }

        }


        /**
         * MD5加密
         * str 内容
         * charset 编码方式
         * @throws Exception
         */
        @SuppressWarnings("unused")
        private String MD5(String str,String charset) throws Exception {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(str.getBytes(charset));
            byte[] result = md.digest();
            StringBuffer sb = new StringBuffer(32);
            for (int i = 0; i < result.length; i++) {
                int val = result[i] & 0xff;
                if (val <= 0xf) {
                    sb.append("0");
                }
                sb.append(Integer.toHexString(val));
            }
            return sb.toString().toLowerCase();
        }

        /**
         * base64编码
         * str 内容
         * charset 编码方式
         * @throws UnsupportedEncodingException
         */
        private String base64(String str, String charset) throws UnsupportedEncodingException{
            String encoded = Base64.encode(str.getBytes(charset));
            return encoded;
        }

        @SuppressWarnings("unused")
        private String urlEncoder(String str, String charset) throws UnsupportedEncodingException{
            String result = URLEncoder.encode(str, charset);
            return result;
        }

        /**
         * 电商Sign签名生成
         * content 内容
         * keyValue ApiKey
         * charset 编码方式
         * @throws UnsupportedEncodingException ,Exception
         * @return DataSign签名
         */
        @SuppressWarnings("unused")
        private  String encrypt (String content,String keyValue,String charset) throws Exception
        {
            if (keyValue != null)
            {
                return base64(MD5(content + keyValue, charset), charset);
            }
            return base64(MD5(content, charset), charset);
        }

        /**
         * 向指定 URL 发送POST方法的请求
         * url 发送请求的 URL
         * params 请求的参数集合
         * @return 远程资源的响应结果
         */
        @SuppressWarnings("unused")
        private  String sendPost(String url, Map<String,String> params) {
            OutputStreamWriter out = null;
            BufferedReader in = null;
            StringBuilder result = new    StringBuilder();
            try {
                URL realUrl = new URL(url);
                HttpURLConnection conn =(HttpURLConnection) realUrl.openConnection();
                // 发送POST请求必须设置如下两行
                conn.setDoOutput(true);
                conn.setDoInput(true);
                // POST方法
                conn.setRequestMethod("POST");
                // 设置通用的请求属性
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");
                conn.setRequestProperty("user-agent",
                        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                conn.connect();
                // 获取URLConnection对象对应的输出流
                out = new OutputStreamWriter(conn.getOutputStream(), StandardCharsets.UTF_8);
                // 发送请求参数
                if (params != null) {
                    StringBuilder param = new    StringBuilder();
                    for (Map.Entry<   String,    String> entry : params.entrySet()) {
                        if(param.length()>0){
                            param.append("&");
                        }
                        param.append(entry.getKey());
                        param.append("=");
                        param.append(entry.getValue());
                        System.out.println(entry.getKey()+":"+entry.getValue());
                    }
                    System.out.println("param:"+ param);
                    out.write(param.toString());
                }
                // flush输出流的缓冲
                out.flush();
                // 定义BufferedReader输入流来读取URL的响应
                in = new BufferedReader(
                        new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
                String line;
                while ((line = in.readLine()) != null) {
                    result.append(line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            //使用finally块来关闭输出流、输入流
            finally{
                try{
                    if(out!=null){
                        out.close();
                    }
                    if(in!=null){
                        in.close();
                    }
                }
                catch(IOException ex){
                    ex.printStackTrace();
                }
            }
            return result.toString();
        }


        public static String getCustomerName(String companyName){
            String lastFourDigits = companyName.substring(companyName.length() - 4);
            return lastFourDigits;
        }

        public static String getShipperCode(String shipperCode) {
            if ("中通快递".equals(shipperCode)){
                return "ZTO";
            } else if ("圆通快递".equals(shipperCode)){
                return "YTO";
            } else if ("申通快递".equals(shipperCode)){
                return "STO";
            } else if ("韵达快递".equals(shipperCode)){
                return "YUNDA";
            } else if ("顺丰快递".equals(shipperCode)){
                return "SF";
            } else if ("百世快递".equals(shipperCode)){
                return "BEST";
            } else if ("邮政快递".equals(shipperCode)){
                return "EMS";
            } else if ("德邦快递".equals(shipperCode)){
                return "DEPPON";
            } else {
                return null;
            }

        }
    }

